{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Optional Lab: Cost Function for Logistic Regression\n",
    "\n",
    "## Goals\n",
    "In this lab, you will:\n",
    "- examine the implementation and utilize the cost function for logistic regression."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "%matplotlib widget\n",
    "import matplotlib.pyplot as plt\n",
    "from lab_utils_common import  plot_data, sigmoid, dlc\n",
    "plt.style.use('./deeplearning.mplstyle')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Dataset \n",
    "Let's start with the same dataset as was used in the decision boundary lab."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [],
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "X_train = np.array([[0.5, 1.5], [1,1], [1.5, 0.5], [3, 0.5], [2, 2], [1, 2.5]])  #(m,n)\n",
    "y_train = np.array([0, 0, 0, 1, 1, 1])                                           #(m,)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "We will use a helper function to plot this data. The data points with label $y=1$ are shown as red crosses, while the data points with label $y=0$ are shown as blue circles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "Canvas(footer_visible=False, header_visible=False, toolbar=Toolbar(toolitems=[('Home', 'Reset original view', …",
      "image/png": "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8vLydO7cuRB3CgDwx1FbW+sK9Q+97bbbdOedd2rWrFnasGGDli1bpq1bt3rUlJWVKSsrSzt27FD//v111113acKECbr33nsDfu+oqChFRHBiBcCenE6nGhoarG4jKCEPkJMnTyo9PV1HjhxRly5d5HK5NGTIEG3dulVXXXVVc91vf/tbHT16VM8884wk6e2331ZhYaHeeuutULYLAPAj5H+qV1ZWKiEhQV26dJEkORwOJSUl6dixYx51FRUVSk5Obl5OSUnxqgEAWMeSsR6Hw+Gx7HL5PglqWeevBgBgjZAHSGJioqqqqponxF0ulyorK5WUlORRl5ycrKNHjzYvV1RUeNUAAKwT8gDp37+/hg8frjfeeEOSVFxcrJSUFI/5D0maMmWKNm3apBMnTsjlcmn58uXKyckJdbsAAD8suQrr0KFDevDBB3Xq1ClFR0frxRdfVFpamnJzczVx4kRNmjRJklRUVKSCggI5nU5lZGRo6dKl6tq1a6jbBQD4YEmAAADsz1Y3TITzDYjB9LZz504lJCRo9OjRzV9ff/11h/b12GOPafjw4YqNjdWBAwf81llxzILpzYpj1tjYqJkzZyo9PV2jR49WTk6OysvLfdaG+rgF25sVx23atGm69dZbNXr0aE2cOFEffPCBzzorfteC6c2KY9bS008/HfDfQjjeWG2rAMnPz9ecOXP03nvvKS8vT7m5uV41ZWVlWrhwoUpKSrR3717V1NRo9erVYdGbJA0ZMkS7du1q/urRo0eH9jV16lSVlJR4XBLdmlXHLJjepNAfM0maO3eu9uzZo127dmnChAnKz8/3qrHquAXTmxT647ZixQrt3r1bu3bt0kMPPaSHH37Yq8aqYxZMb5I1v2uStG/fPu3Zs8fvhUJWHbeLsU2AnDx5Uvv379cdd9whyT3JXl5e7vXXV3FxsSZPnqy4uDg5HA7NmzdP69atC4verDBq1CglJiYGrLHimAXbmxW6d++u8ePHN19GftNNN6msrMyrzorjFmxvVoiNjW3+33V1dT6fCGHV71owvVnlzJkzevTRR/XMM8943eLQxKrjdjFdrG4gWIFuQGx5BZcVNyAG25skHT58WBkZGYqMjNSsWbN03333dWhvwQj3mzatPmYvvfSSsrKyvNaHw3Hz15tkzXGbP3++du3aJUk+P+CsPGYX602y5pgtXLhQt99+u1JTU/3WhMPvmi+2CRApvG9ADKa366+/Xh9//LFiYmJUWVmpGTNmqG/fvpo2bVpIegwkXG/atPqYLVmyREeOHNGzzz7rc7uVxy1Qb1Ydt5dfflmS9Nprr+lXv/qV1q5d61Vj1TG7WG9WHLO//e1vev/99/Xkk09etDYc/42Gz3ncRYTzDYjB9ta7d2/FxMQ07zN9+nTt3r27Q3sLRjjftGnlMXvuuee0ceNGrV27Vj179vTabuVxu1hvVv+uzZw5Uzt37tSpU6c81ofD75q/3qw4Zu+++64OHTqkESNGaPjw4aqqqlJOTo7Xw2XD4bj5YpsACecbEIPtrbq6Wk6nU5JUX1+vLVu2aMSIER3aWzDC+aZNq47ZsmXLtG7dOq1fv95j/Lwlq45bML2F+rjV1dXp+PHjzcsbN25Unz59dMUVV3jUWXHMgu3Nit+1n/70pzp48KA+/PBDffjhhxowYID++Mc/aty4cR514fpv1Fb3gYTzDYjB9PbKK69o+fLlioyM1Pnz5zV16lQ9/vjjfifO2sMjjzyizZs3q6amRn379lVUVJT27t0bFscsmN6sOGaVlZW69tprlZqaql69ekmSunXrpnfeecfy4xZsb6E+bseOHdM999yjxsZGORwO9evXT7/+9a81YsQIy49ZsL1Z8bvWWtMfosOGDbP8uAXDVgECAAgfthnCAgCEFwIEAGCEAAEAGCFAAABGCBAAgBECBABghAABABghQAAARggQwIfq6molJiZq3rx5HutLSkqa72QGOjsCBPDhyiuv1IIFC/Tmm29q3759ktxvrJs7d67mzZunX/7yl9Y2CIQBAgTwIzc3V1deeaX+/d//Xe+//75mzpypnJwcLVq0qLnm888/1+23364BAwYoPT1d27Zts7BjILR4FhYQwJo1a/Twww8rKipK48eP16uvvqrIyMjm7XPnzlWvXr20ePFibd++XQ888ID27t2rPn36WNg1EBqcgQABfPe735XkfpnPCy+84BEep0+f1ltvvaXHH39cPXv21KRJk3TdddfprbfesqpdIKQIEMCPDz74QHfccYduueUWnT59WmvWrPHY/umnnyoqKsrjxT7Dhg3TwYMHQ90qYAkCBPDh0KFDysnJ0c0336yNGzdq0qRJevrpp/Xll1821zQ0NCg6Otpjv969e6uhoSHU7QKWIECAVsrLy5Wdna3vfve7WrVqlbp27aonn3xStbW1Wrp0aXNdVFSU6uvrPfatq6tTVFRUqFsGLEGAAC1UV1crOztb/fr10xtvvKEePXpIkgYPHqzZs2frpZdeUnl5uSTp6quvVkNDgyorK5v3Ly0t1dChQy3pHQg1rsICLsGcOXPUu3dvLV68WP/zP/+j+fPn6/3331ffvn2tbg3ocF2sbgCwsyVLluiBBx7QoEGDlJCQoBUrVhAe6DQ4AwEAGGEOBABghAABABghQAAARggQAIARAgQAYIQAAQAYIUAAAEYIEACAEQIEAGCEAAEAGPn/+z1CresgRywAAAAASUVORK5CYII=",
      "text/html": "\n            <div style=\"display: inline-block;\">\n                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n                    Figure\n                </div>\n                <img src='' width=400.0/>\n            </div>\n        ",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "8b8e9aa822714ef6b137dc661735ee88"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig,ax = plt.subplots(1,1,figsize=(4,4))\n",
    "plot_data(X_train, y_train, ax)\n",
    "\n",
    "# Set both axes to be from 0-4\n",
    "ax.axis([0, 4, 0, 3.5])\n",
    "ax.set_ylabel('$x_1$', fontsize=12)\n",
    "ax.set_xlabel('$x_0$', fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Cost function\n",
    "\n",
    "In a previous lab, you developed the *logistic loss* function. Recall, loss is defined to apply to one example. Here you combine the losses to form the **cost**, which includes all the examples.\n",
    "\n",
    "\n",
    "Recall that for logistic regression, the cost function is of the form \n",
    "\n",
    "$$ J(\\mathbf{w},b) = \\frac{1}{m} \\sum_{i=0}^{m-1} \\left[ loss(f_{\\mathbf{w},b}(\\mathbf{x}^{(i)}), y^{(i)}) \\right] \\tag{1}$$\n",
    "\n",
    "where\n",
    "* $loss(f_{\\mathbf{w},b}(\\mathbf{x}^{(i)}), y^{(i)})$ is the cost for a single data point, which is:\n",
    "\n",
    "    $$loss(f_{\\mathbf{w},b}(\\mathbf{x}^{(i)}), y^{(i)}) = -y^{(i)} \\log\\left(f_{\\mathbf{w},b}\\left( \\mathbf{x}^{(i)} \\right) \\right) - \\left( 1 - y^{(i)}\\right) \\log \\left( 1 - f_{\\mathbf{w},b}\\left( \\mathbf{x}^{(i)} \\right) \\right) \\tag{2}$$\n",
    "    \n",
    "*  where m is the number of training examples in the data set and:\n",
    "$$\n",
    "\\begin{align}\n",
    "  f_{\\mathbf{w},b}(\\mathbf{x^{(i)}}) &= g(z^{(i)})\\tag{3} \\\\\n",
    "  z^{(i)} &= \\mathbf{w} \\cdot \\mathbf{x}^{(i)}+ b\\tag{4} \\\\\n",
    "  g(z^{(i)}) &= \\frac{1}{1+e^{-z^{(i)}}}\\tag{5} \n",
    "\\end{align}\n",
    "$$\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "<a name='ex-02'></a>\n",
    "#### Code Description\n",
    "\n",
    "The algorithm for `compute_cost_logistic` loops over all the examples calculating the loss for each example and accumulating the total.\n",
    "\n",
    "Note that the variables X and y are not scalar values but matrices of shape ($m, n$) and ($𝑚$,) respectively, where  $𝑛$ is the number of features and $𝑚$ is the number of training examples.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def compute_cost_logistic(X, y, w, b):\n",
    "    \"\"\"\n",
    "    Computes cost\n",
    "\n",
    "    Args:\n",
    "      X (ndarray (m,n)): Data, m examples with n features\n",
    "      y (ndarray (m,)) : target values\n",
    "      w (ndarray (n,)) : model parameters  \n",
    "      b (scalar)       : model parameter\n",
    "      \n",
    "    Returns:\n",
    "      cost (scalar): cost\n",
    "    \"\"\"\n",
    "\n",
    "    m = X.shape[0]\n",
    "    cost = 0.0\n",
    "    for i in range(m):\n",
    "        z_i = np.dot(X[i],w) + b\n",
    "        f_wb_i = sigmoid(z_i)\n",
    "        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)\n",
    "             \n",
    "    cost = cost / m\n",
    "    return cost\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Check the implementation of the cost function using the cell below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.36686678640551745\n"
     ]
    }
   ],
   "source": [
    "w_tmp = np.array([1,1])\n",
    "b_tmp = -3\n",
    "print(compute_cost_logistic(X_train, y_train, w_tmp, b_tmp))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "**Expected output**: 0.3668667864055175"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Example\n",
    "Now, let's see what the cost function output is for a different value of $w$. \n",
    "\n",
    "* In a previous lab, you plotted the decision boundary for  $b = -3, w_0 = 1, w_1 = 1$. That is, you had `b = -3, w = np.array([1,1])`.\n",
    "\n",
    "* Let's say you want to see if $b = -4, w_0 = 1, w_1 = 1$, or `b = -4, w = np.array([1,1])` provides a better model.\n",
    "\n",
    "Let's first plot the decision boundary for these two different $b$ values to see which one fits the data better.\n",
    "\n",
    "* For $b = -3, w_0 = 1, w_1 = 1$, we'll plot $-3 + x_0+x_1 = 0$ (shown in blue)\n",
    "* For $b = -4, w_0 = 1, w_1 = 1$, we'll plot $-4 + x_0+x_1 = 0$ (shown in magenta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "Canvas(footer_visible=False, header_visible=False, toolbar=Toolbar(toolitems=[('Home', 'Reset original view', …",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABTkUlEQVR4nO3deVzU1f7H8deAuCFKKBIKipriknuWqWlaCrihaVZabtm1LJduWVm3sq4/t9Lg5m275q4tWiqiYaaYmpb7kku5L6i4Emiisvz+OA4yMGeAEb4zw3yejweP7sznO8zHucqb8z3f7zmmpKSkTIQQQogC8nB0A0IIIVyTBIgQQgi7SIAIIYSwiwSIEEIIu0iACCGEsIsEiBBCCLtIgAghhLCLBIgQQgi7SIAIIYSwiwSIEEIIu0iACCGEsIsEiBBCCLtIgAghhLCLBIgQQgi7SIAIIYSwiwSIEEIIu0iACCGEsIsEiBBCCLtIgAghhLCLBIgQQgi7SIAIIYSwiwSIEEIIu0iACCGEsIsEiBBCCLtIgAghhLCLBIgQQgi7SIAIIYSwiwSIyDJ//nx8fX2zvqpUqULDhg3p168fixcvJiMjo8jee8KECTRs2LBAr2nYsCETJkwooo6sy/kZ+fn5Ua9ePQYOHMjBgwcN7aWgunTpwgsvvODoNkQxUsLRDQjnM3v2bKpUqcL169c5deoUP/74I88++yyzZs3i66+/pkyZMoX+nv3796dz584Fes28efOoVKlSofeSH+bPKD09naNHj/LBBx8QGRnJpk2bqFChgkN6EsJoEiAil4YNG1KzZs2sx08++SSRkZEMHDiQd955hw8++KDQ37Nq1apUrVq1QK9p3LhxofeRX9k/o5YtWxIYGEiPHj3YvHkzHTt2dFhfRrl+/TqlSpVydBvCweQUlsiXyMhIOnfuzJw5c/j777+znv/777959913adSoEf7+/jRq1IgPP/ww1+muCxcu8Morr9CgQQMqV65MgwYN+Mc//sH169eB3Kew0tLSGDduHE2aNCEgIICaNWsSHh7Opk2bso6xdgrrp59+omPHjtx9991Uq1aNvn375jq11KVLF8LDw1mzZg0PPfQQgYGBtGnThp9//tnuz8fHxweAmzdvFrgf3ak4X19f5s+fn/X4hRdeoH79+uzcuZOwsDACAwNp0aIF3333Xa7Xfvfdd7Ro0YLKlSvTsmVLli1bluuYCxcuMGrUKJo3b05gYCANGjRgyJAhnD592uK4CRMm4Ovry759+3jssceoWrUqAwcOZPTo0dSuXTvXn/nKlSsEBQUxbty4PD414eokQES+derUievXr7Njxw5A/ZDv1asXc+bM4fnnn2fRokX079+fDz74gLfffjvrdUlJSXTq1Invv/+eYcOGsXDhQt577z3S0tK4ceOG1feKiori008/ZejQoXz33Xf897//pW3btly+fFnb308//USfPn3w9vZmxowZTJkyhf379xMeHp7rh+LRo0d58803eemll5g7dy6VKlWiX79+XLp0KV+fRXp6OmlpaVy/fp0//viD999/H39/f9q0aWNXP/mVkpLCc889x5NPPsmCBQto3Lgxzz33HH/++WfWMWvXrmXIkCHUrFmTuXPnMnz4cMaMGcOhQ4csvtfly5cpWbIk77zzDosWLWL8+PGcO3eOsLAwUlNTc7133759ad26NQsWLGDYsGE8++yznD9/ntjYWIvjFi5cyN9//03//v3t+jMK1yGnsES+BQUFAZCYmAjAokWL2LRpE8uXL6d169YAtGvXDoBJkyYxatQo/P39+e9//8uxY8eIj4+3OO3Uu3dv7Xtt2bKF9u3bW0z6RkRE2Oxv3LhxhISEsGjRIkqUUH+1W7RowX333ce0adMYP3581rEXL15kxYoV1KpVC1Cnw0JDQ7N+6OelRYsWFo8DAwP55ptvKF++vF395FdKSgrz58+nbdu2ALRq1Yo1a9YQExPDq6++CqgRQ506dfjqq6/w8FC/I4aGhvLoo49afK/atWszefLkrMfp6el07NiR2rVrs2rVKrp162Zx/NChQ3NNwrdu3ZqZM2fSs2fPrOdmzpxJx44dqVatWoH/fMK1yAhE5FtmZiYAJpMJgNWrVxMcHMwDDzxAWlpa1leHDh24efMmW7ZsASA+Pp5mzZoVaM6iadOmrFq1in//+99s2rRJO1Ixu3r1Krt27eKxxx7L+mENEBISwgMPPMAvv/xicXytWrWywgPA398ff39/EhIS8tXfvHnziI+PZ82aNcyfP5/Q0FAef/xx/vjjD7v6ya+yZctmhQdAqVKlqFWrVlbf6enpbN++ne7du2eFB8B9991n9Qf6rFmzaNu2LcHBwVSsWJEqVapw9erVXKMVgK5du+Z6bsiQIaxfv57Dhw8DsH37dnbv3s3AgQPt+vMJ1yIBIvLN/EMqICAAgPPnz3Py5EkqVapk8dWhQweArNNBly5dokqVKgV6r1deeYUxY8bwww8/EBERQc2aNRk2bBgXL160enxSUhKZmZlZvWUXEBCQ69TXXXfdleu4kiVLWj11Y039+vVp2rQpzZo1o0uXLnz11VdkZmYyceJEu/rJL19fX5t9X7x4kZs3b1K5cuVcx+V87n//+x+jRo2iZcuWzJw5k9WrVxMfH0+lSpWsfg533313rue6du1KQEAAM2fOBGDGjBkEBQXRqVMne/54wsXIKSyRbytXrqR06dI0adIEAD8/P6pXr86sWbOsHm/+jbdixYqcOXOmQO/l5eXFqFGjGDVqFImJiaxcuZK33nqLa9euZf2wys7X1xeTyZR1ei27xMRE/Pz8CvT+BVWmTBlCQkLYu3dvgfspXbp0rhGWvQFTsWJFvLy8OHfuXK7auXPnqF27dtbj7777jrZt21qcxrpx44b2vc0jz+y8vLx45pln+PLLLxk5ciTff/89I0eOxNPT067+hWuREYjIl5iYGH744QcGDRpE2bJlAXjkkUdISEjA29ubpk2b5vqqWLEiAO3bt2fbtm3s2bPHrvcOCAigf//+tGvXjv3791s9xtvbmyZNmrB06VLS09Oznj9x4gSbN2/OmqMpKn///TdHjx7N+jMXpJ/g4GD27dtn8f1WrFhhVx+enp40a9aMmJgYiyvhtm7dyokTJ3L17OXlZfHcV199ZdFvfgwaNIjk5GQGDBjAjRs3ZPLcjcgIROSyZ88eLl68yI0bNzh16hQrV65kyZIltG/fnnfffTfruD59+jB//nwiIyN58cUXadiwITdu3ODo0aP88MMPfP3115QqVYphw4axaNEievTowauvvkr9+vW5dOkSK1asYOrUqVmXwGb31FNPce+999K4cWN8fX3ZvXs3q1evtnlu/a233qJPnz488cQTPPvss1y9epUJEyZQvnx5XnrppSL5jDIzMzl79iz/+9//uHz5MkOHDi1wP4899hgjRoxg4sSJPPjgg+zatYuvv/7a7t7GjBlDz5496du3L4MGDeLChQtMmDAh1+m0jh07MnXqVCZPnswDDzzA1q1bmT59eoFvhKxSpQrh4eHExsbStWtXAgMD7e5duBYJEJHLgAEDAHVqpVKlSjRu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",
      "text/html": "\n            <div style=\"display: inline-block;\">\n                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n                    Figure\n                </div>\n                <img src='' width=400.0/>\n            </div>\n        ",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "c2b2b69dcbcc4b899752bb860409dc0f"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Choose values between 0 and 6\n",
    "x0 = np.arange(0,6)\n",
    "\n",
    "# Plot the two decision boundaries\n",
    "x1 = 3 - x0\n",
    "x1_other = 4 - x0\n",
    "\n",
    "fig,ax = plt.subplots(1, 1, figsize=(4,4))\n",
    "# Plot the decision boundary\n",
    "ax.plot(x0,x1, c=dlc[\"dlblue\"], label=\"$b$=-3\")\n",
    "ax.plot(x0,x1_other, c=dlc[\"dlmagenta\"], label=\"$b$=-4\")\n",
    "ax.axis([0, 4, 0, 4])\n",
    "\n",
    "# Plot the original data\n",
    "plot_data(X_train,y_train,ax)\n",
    "ax.axis([0, 4, 0, 4])\n",
    "ax.set_ylabel('$x_1$', fontsize=12)\n",
    "ax.set_xlabel('$x_0$', fontsize=12)\n",
    "plt.legend(loc=\"upper right\")\n",
    "plt.title(\"Decision Boundary\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "You can see from this plot that `b = -4, w = np.array([1,1])` is a worse model for the training data. Let's see if the cost function implementation reflects this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cost for b = -3 :  0.36686678640551745\n",
      "Cost for b = -4 :  0.5036808636748461\n"
     ]
    }
   ],
   "source": [
    "w_array1 = np.array([1,1])\n",
    "b_1 = -3\n",
    "w_array2 = np.array([1,1])\n",
    "b_2 = -4\n",
    "\n",
    "print(\"Cost for b = -3 : \", compute_cost_logistic(X_train, y_train, w_array1, b_1))\n",
    "print(\"Cost for b = -4 : \", compute_cost_logistic(X_train, y_train, w_array2, b_2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "**Expected output**\n",
    "\n",
    "Cost for b = -3 :  0.3668667864055175\n",
    "\n",
    "Cost for b = -4 :  0.5036808636748461\n",
    "\n",
    "\n",
    "You can see the cost function behaves as expected and the cost for `b = -4, w = np.array([1,1])` is indeed higher than the cost for `b = -3, w = np.array([1,1])`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Congratulations!\n",
    "In this lab you examined and utilized the cost function for logistic regression."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}